const express = require('express')
// 处理上传文件的中间件
const formidableMiddleware = require('express-formidable')
const advModel = require('../db/model/advModel')
const adminModel = require('../db/model/adminModel')
const jwt = require('../utils/jwt')

const router = express.Router()
// 创建处理formdata的中间件函数
const middleWare = formidableMiddleware({
  // 上传的文件存储的路径
  uploadDir: './public/uploadDir',
  // 上传的文件保留后缀名
  keepExtensions: true,
})

// 定义添加,获取,修改和删除广告,验证token的中间件
const verifyTokenMiddleWare = async function (req, res, next) {
  //1. 获取token
  const authorization = req.get('authorization')
  // 判断是否上传了token
  if (authorization) {
    // 去数据库中查询是否有这个token信息
    const admin = await adminModel.findOne({ token: authorization })
    //判断是否查找到用户信息,如果有,则token正确,如果没有则token错误
    if (admin) {
      // 判断token是否在有效期内
      // 解析token
      const result = jwt.decode(authorization)
      if (Date.now() < result.expires) {
        next()
        return
      }
    }
  }

  res.send({ success: false, msg: 'token无效' })
}
// 使用处理formdata的中间件函数. 这样使用,则只有当浏览器给服务器请求/addAdv路由的时候,这个中间件才会执行
router.post('/addAdv', middleWare, verifyTokenMiddleWare, async (req, res) => {
  const { advTitle, advCategory, advLink } = req.fields
  // 数据库中存储的应该是访问文件的url地址

  const filename = req.files.file.path.split('\\')[2]
  const advAvatar = `http://localhost:5001/uploadDir/${filename}`

  // 将添加的广告信息存储到数据库中
  try {
    await advModel.create({ advTitle, advCategory, advLink, advAvatar })
    res.send({ success: true, msg: '广告添加成功' })
  } catch (error) {
    res.send({ success: false, msg: '广告添加失败' })
  }
})

// 响应广告数据的接口
router.get('/findAdvs', verifyTokenMiddleWare, async (req, res) => {
  const result = await advModel.find()
  res.send({ success: true, msg: '查询成功', data: result })
})
module.exports = router
